<!DOCTYPE html>
<html lang="zh-cmn-Hans" prefix="og: http://ogp.me/ns#" class="han-init">
<head>
  <meta charset="utf-8">
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1" />
  <link rel="icon" href="http://upeng.github.io/favicon.ico">
  <title>upeng</title>
  <link rel="stylesheet" href="/css/style.css">
  <link rel="stylesheet" href="/lib/fancybox/jquery.fancybox-1.3.4.css">
  <!--在这里倒入jquery 方便处理部分页面的jquery-->
  <script src="https://cdn.staticfile.org/jquery/1.7/jquery.min.js" type="text/javascript" ></script>
</head>
<body class="home">
	<header class="site-header navfixed-false">
  <div class="container">
      <h1><a href="/" title="upeng"><span class="octicon octicon-mark-github"></span> upeng</a></h1>
      <nav class="site-header-nav" role="navigation">
        
              
              <a href="/"  class=" site-header-nav-item hvr-underline-from-center" title="Home">Home</a>
        
              
              <a href="/categories/"  class=" site-header-nav-item hvr-underline-from-center" title="Categories">Categories</a>
        
              
              <a href="/bookmark/"  class=" site-header-nav-item hvr-underline-from-center" title="Bookmark">Bookmark</a>
        
              
              <a href="http://shareup.sinaapp.com"  class=" site-header-nav-item hvr-underline-from-center" title="Share">Share</a>
        
              
              <a href="/about/"  class=" site-header-nav-item hvr-underline-from-center" title="About">About</a>
        
      </nav>
  </div>
</header>

	<section class="banner-false">
    <div class="collection-head">
        <div class="container">
            <div class="collection-title">
                <h1 class="collection-header" id="site-description">
                    Learning Diary
                </h1>
                <div class="collection-info">
                    
                    
                        <span class="meta-info">
                            
                                <span class="octicon octicon-location">
                                   
                                        Beijing, China
                                    
                                </span>
                                
                            
                        </span>
                    
                        <span class="meta-info">
                            
                                <span class="octicon octicon-mark-github">
                                   
                                </span>
                                
                                    <a href="http://github.com/upeng" target="_blank">upeng</a>
                                
                            
                        </span>
                    
                        <span class="meta-info">
                            
                                <span class="octicon octicon-organization">
                                   
                                        weibo
                                    
                                </span>
                                
                            
                        </span>
                    
                </div>
            </div>
        </div>
    </div>
</section>
	   <section class="container">
    <div class="columns">
        <div class="column two-thirds">
            
                  <article id="post-linux-bash" class="repo-list">
    <div class="repo-list-item" >
      <h3 class="repo-list-name" itemprop="name">
        
  
      <a class="article-title" href="/2015/10/28/linux-bash/">常用的bash命令快捷建</a>
  

      </h3>
      <div class="repo-list-description">
        
          <p><code>ctrl</code>键组合<br><code>ctrl+a</code>:光标移到行首。<br><code>ctrl+b</code>:光标左移一个字母<br><code>ctrl+c</code>:杀死当前进程。<br><code>ctrl+d</code>:退出当前 Shell。<br><code>ctrl+e</code>:光标移到行尾。<br><code>ctrl+h</code>:删除光标前一个字符，同 backspace 键相同。<br><code>ctrl+k</code>:清除光标后至行尾的内容。<br><code>ctrl+l</code>:清屏，相当于clear。<br><code>ctrl+r</code>:搜索之前打过的命令。会有一个提示，根据你输入的关键字进行搜索bash的history<br><code>ctrl+u</code>: 清除光标前至行首间的所有内容。<br><code>ctrl+w</code>: 移除光标前的一个单词<br><code>ctrl+t</code>: 交换光标位置前的两个字符<br><code>ctrl+y</code>: 粘贴或者恢复上次的删除<br><code>ctrl+d</code>: 删除光标所在字母;注意和backspace以及ctrl+h的区别，这2个是删除光标前的字符<br><code>ctrl+f</code>: 光标右移<br><code>ctrl+z</code> : 把当前进程转到后台运行，使用’ fg ‘命令恢复。比如top -d1 然后ctrl+z ，到后台，然后fg,重新恢复<br>esc组合<br><code>esc+d</code>: 删除光标后的一个词<br><code>esc+f</code>: 往右跳一个词<br><code>esc+b</code>: 往左跳一个词<br><code>esc+t</code>: 交换光标位置前的两个单词。</p>

        
      </div>
      <p class="repo-list-meta">
        <span class="meta-info">
          <span class="octicon octicon-calendar"></span>
           <time datetime="2015-10-28T09:56:00.000Z" itemprop="datePublished">2015-10-28</time>
        </span>

        
          <span class="meta-info">
            <span class="octicon octicon-file-directory"></span>
            <a href='/categories/Linux/' title=''>Linux</a>
          </span>
        
      
        <!--
          
            <ul class="article-tag-list"><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/bash/">bash</a></li></ul>
          
        -->

      </p>
    </div>
  </article>
            
                  <article id="post-php-design-single" class="repo-list">
    <div class="repo-list-item" >
      <h3 class="repo-list-name" itemprop="name">
        
  
      <a class="article-title" href="/2015/10/14/php-design-single/">PHP设计模式-单例模式</a>
  

      </h3>
      <div class="repo-list-description">
        
          <h2 id="单例模式"><a href="#单例模式" class="headerlink" title="单例模式"></a>单例模式</h2><p><code>场景</code>:有多个类需要读取数据库，而数据库连接类只需要一个对象就够了。其他的类只需调用这个类的连接对象即可<br><code>问题</code>：如何获取两个严格相等（全等）的对象（===）<br><code>答案</code>：只有当两个对象是同一个对象的时候才是全等的！</p>
        
      </div>
      <p class="repo-list-meta">
        <span class="meta-info">
          <span class="octicon octicon-calendar"></span>
           <time datetime="2015-10-14T14:21:00.000Z" itemprop="datePublished">2015-10-14</time>
        </span>

        
          <span class="meta-info">
            <span class="octicon octicon-file-directory"></span>
            <a href='/categories/PHP/' title=''>PHP</a>
          </span>
        
      
        <!--
          
            <ul class="article-tag-list"><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/设计模式/">设计模式</a></li></ul>
          
        -->

      </p>
    </div>
  </article>
            
                  <article id="post-php-design-model" class="repo-list">
    <div class="repo-list-item" >
      <h3 class="repo-list-name" itemprop="name">
        
  
      <a class="article-title" href="/2015/10/12/php-design-model/">PHP设计模式-工厂模式</a>
  

      </h3>
      <div class="repo-list-description">
        
          <h2 id="简单工厂模式"><a href="#简单工厂模式" class="headerlink" title="简单工厂模式"></a>简单工厂模式</h2><p>直接上代码，直观了解工厂模式！</p>
<pre><code>&lt;?php
//接口，是客户端和服务端共同遵守的开发规范
interface db
{
    public function conn(){};
}

//服务端
class Dbmysql implements db
{
    public function conn()
    {
        echo &#39;connected the mysql&#39;;
    }
}

class Dbsqlite implements db
{
    public function conn()
    {
        echo &#39;connected the sqlite&#39;;
    }
}

//客户端 
$mysql = new Dbmysql();
$mysql-&gt;conn();

$sqlite = new Dbsqlite();
$sqlite-&gt;conn();

//如果服务端不想让客户端知道自己内部类的实现细节，统一一个固定的入口，这样就是我们所说的
//使用方知道的越少越好！将上述两个类封装起来

//服务端，开发接口Dbconnect::type(@param)

class Dbconnect 
{
    public static function type($type)
    {
        if ($type == &#39;mysql&#39;)
        {
            return new Dbmysql();
        }
        else if ($type == &#39;sqlite&#39;)
        {
            return new Dbsqlite();
        }
        else
        {
            throw new Exception(&quot;Error type is not exist&quot;, 1);

        }
    }
}

//客户端
$mysql = Dbconnect::type(&#39;mysql&#39;);
$mysql-&gt;conn();

$sqlite = Dbconnect::type(&#39;sqlite&#39;);
$sqlite-&gt;conn();
</code></pre><p>在我们使用围脖的接口时，和这个有点类似，一个业务需求给你一个方法如showbatch(),friendship(),show()；当然他们是某个类的静态方法，我们不需要知道它是如何具体实现的，只要知道，当我们传递合适的参数，使用这个接口，就可以获得自己想要的数据即可</p>
<p><code>Q:现在如果需要连接oracle、PDO、SqlServer，怎么办？当然php可以直接修改服务端的代码，增加else if，但是对于java,c++而言，如果修改代码，还需要再次编译，这是非常耗时的!</code></p>
<blockquote>
<p><strong>在面向对象设计（OOD）设计法则中，重要的开闭原则：对于修改是封闭，对于扩展是开放的</strong></p>
</blockquote>
<h2 id="工厂方法"><a href="#工厂方法" class="headerlink" title="工厂方法"></a>工厂方法</h2><p><strong>注意开闭原则</strong><br>//<strong>服务端</strong></p>
<pre><code>interface Factory
{
    public function createDb(){};
}

class mysqlFactory implements Factory
{
    public function createDb()
    {
        return new Dbmysql();
    }
}

class sqliteFactory implements Factory
{
    public function createDb()
    {
        return new Dbsqlite();
    }
}

//**客户端**
//由于开放了两个接口，一个是创建数据库，一个是连接数据库

$fact = new mysqlFactory();
$db = $fact-&gt;createDb();
$db-&gt;conn();

$fact = new sqliteFactory();
$db-&gt;$fact-&gt;createDb();
$db-&gt;conn(); 

//现在如果新增了oracle数据库连接，就可以扩展oracle，不需要修改代码，扩展如下：

class Dboracle implements db()
{
    public function conn()
    {
        echo &#39;connected oracle database&#39;;
    }
}
class oracleFactory implements Factory
{
    public function createDb()
    {
        return new Dboracle();
    }
}


$fact = new oracleFactory();
$db = $fact-&gt;createDb();
$db-&gt;conn();
</code></pre>
        
      </div>
      <p class="repo-list-meta">
        <span class="meta-info">
          <span class="octicon octicon-calendar"></span>
           <time datetime="2015-10-12T14:12:00.000Z" itemprop="datePublished">2015-10-12</time>
        </span>

        
          <span class="meta-info">
            <span class="octicon octicon-file-directory"></span>
            <a href='/categories/PHP/' title=''>PHP</a>
          </span>
        
      
        <!--
          
            <ul class="article-tag-list"><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/设计模式/">设计模式</a></li></ul>
          
        -->

      </p>
    </div>
  </article>
            
                  <article id="post-php-ci1" class="repo-list">
    <div class="repo-list-item" >
      <h3 class="repo-list-name" itemprop="name">
        
  
      <a class="article-title" href="/2015/08/13/php-ci1/">CI模型-视图-控制器 命名规范</a>
  

      </h3>
      <div class="repo-list-description">
        
          <h3 id="controller："><a href="#controller：" class="headerlink" title="controller："></a>controller：</h3><pre><code>控制器类名必须以大写字母开头
         class  User  extends  CI_Controller{}          //建议写法
         class  BlogUser  extends  CI_Controller{}  //建议写法  
 以下这样写是无效的
         class  blog  extends  CI_Controller{}
         class  blogUser  extends  CI_Controller{}

 控制器类的方法没有要求

 控制器文件名也没有要求，但是建议全部小写，且注意文件名和类名同一个单词
 controller/blog.php 、controller/bloguser.php 
</code></pre><h3 id="model"><a href="#model" class="headerlink" title="model"></a>model</h3><pre><code>模型类名首字母也必须大写，其他小写
例如：
class  Blog_model  extends  CI_Model {    //class BlogModel extends  CI_Model也可
    function __construct(){
        parent::__construct();
    }
}

载入model以及使用model
$this-&gt;load-&gt;model(&#39;Blog_model&#39;);    //model类名  $this-&gt;load-&gt;model(&#39;BlogModel&#39;); 
$this-&gt;Blog_model-&gt;function();         //载入之后可直接通过类名访问其方法$this-&gt;BlogModel-&gt;function();

模型的文件名没有要求，但是建议全部小写,且注意文件名和类名同一个单词 
例如：model/blog_model.php   //       model/blogmodel.php
</code></pre><h3 id="view"><a href="#view" class="headerlink" title="view"></a>view</h3><pre><code>文件名是 views/viewname.php
载入视图 $this-&gt;load-&gt;view(&quot;viewname&quot;);
总之：文件名和载入一致即可，大小写没有特别要求
例如：文件名为views/viewName.php  载入时$this-&gt;load-&gt;view(&quot;viewName&quot;);

用子文件夹存储视图
views/user/bloguser.php   载入时$this-&gt;load-&gt;view(&quot;user/bloguser&quot;);



总结，对于模型和控制器，类名的首字母必须大写，其他字母无要求，可根据个人习惯
          文件名没有特别要求，建议首字母小写或全小写，名字与类名一致（除大小写可不一致）载入的模型和模型类名一致

          对于视图，文件名和载入时一致即可，载入时不带后缀 

  因为model和controller如果很多，载入model时不可能一个一个打开查看其类名，但是可以快速根据文件名确定其类名

  那就要求对文件的命名和类的命名要有一个一致的规范

我的习惯（保持）
  【1】controller,类名User或UserBlog，文件名user.php或userblog.php
  【2】model，类名UserModel或UserBlogModel ，文件名usermodel.php或userblogmodel.php
   载入方法$this-&gt;load-&gt;model(&quot;UserModel&quot;);
   用在构造方法里如下：
   class BlogModel  extends  CI_Controller{
       function __construct(){
            parent::__construct();
            $this-&gt;load-&gt;model(&#39;UserModel&#39;); 
        }
    }
  【3】view，文件名userblog.php 或user/blog.php  载入方法$this-&gt;load-&gt;view(&quot;userblog&quot;);或
    $this-&gt;load-&gt;view(&quot;user/blog&quot;);
</code></pre>
        
      </div>
      <p class="repo-list-meta">
        <span class="meta-info">
          <span class="octicon octicon-calendar"></span>
           <time datetime="2015-08-13T11:47:00.000Z" itemprop="datePublished">2015-08-13</time>
        </span>

        
          <span class="meta-info">
            <span class="octicon octicon-file-directory"></span>
            <a href='/categories/PHP/' title=''>PHP</a>
          </span>
        
      
        <!--
          
            <ul class="article-tag-list"><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/CodeIgniter/">CodeIgniter</a></li></ul>
          
        -->

      </p>
    </div>
  </article>
            
                  <article id="post-mysql导入导出" class="repo-list">
    <div class="repo-list-item" >
      <h3 class="repo-list-name" itemprop="name">
        
  
      <a class="article-title" href="/2015/08/03/mysql导入导出/">linux下导入、导出mysql数据库命令</a>
  

      </h3>
      <div class="repo-list-description">
        
          <h2 id="一、导出数据库用mysqldump命令（注意mysql的安装路径，即此命令的路径）："><a href="#一、导出数据库用mysqldump命令（注意mysql的安装路径，即此命令的路径）：" class="headerlink" title="一、导出数据库用mysqldump命令（注意mysql的安装路径，即此命令的路径）："></a>一、导出数据库用mysqldump命令（注意mysql的安装路径，即此命令的路径）：</h2><ul>
<li><h3 id="导出数据和表结构："><a href="#导出数据和表结构：" class="headerlink" title="导出数据和表结构："></a>导出数据和表结构：</h3><p>mysqldump -u用户名 -p密码 数据库名 &gt; 数据库名.sql<br>eg /usr/local/mysql/bin/   mysqldump -uroot -p abc &gt; abc.sql<br>敲回车后会提示输入密码</p>
</li>
<li><h3 id="只导出表结构"><a href="#只导出表结构" class="headerlink" title="只导出表结构"></a>只导出表结构</h3><p>mysqldump -u用户名 -p密码 -d 数据库名 &gt; 数据库名.sql<br>eg /usr/local/mysql/bin/   mysqldump -uroot -p -d abc &gt; abc.sql</p>
</li>
</ul>
<p>注：/usr/local/mysql/bin/  —&gt;  mysql的data目录</p>
<h2 id="二、导入数据库"><a href="#二、导入数据库" class="headerlink" title="二、导入数据库"></a>二、导入数据库</h2><ol>
<li><h3 id="首先建空数据库"><a href="#首先建空数据库" class="headerlink" title="首先建空数据库"></a>首先建空数据库</h3><p>mysql&gt;create database abc;</p>
</li>
<li><h3 id="导入数据库"><a href="#导入数据库" class="headerlink" title="导入数据库"></a>导入数据库</h3><p>方法一：<br>（1）选择数据库<br>mysql&gt;use abc;<br>（2）设置数据库编码<br>mysql&gt;set names utf8;<br>（3）导入数据（注意sql文件的路径）<br>mysql&gt;source /home/abc/abc.sql;<br>方法二：<br>mysql -u用户名 -p密码 数据库名 &lt; 数据库名.sql<br>eg mysql -uabc_f -p abc &lt; abc.sql</p>
</li>
</ol>
<p>建议使用第二种方法导入。</p>
<h3 id="三、关于导入导出数据库需注意的地方（总是忘记！）"><a href="#三、关于导入导出数据库需注意的地方（总是忘记！）" class="headerlink" title="三、关于导入导出数据库需注意的地方（总是忘记！）"></a>三、关于导入导出数据库需注意的地方（总是忘记！）</h3><ul>
<li><p><code>而导入数据库和导出正好相反（废话），要先进入mysql，然后使用source命令</code></p>
</li>
<li><p><code>导出数据库是在linux命令行模式中，当前位于哪个目录就导出到哪里（途中可能需要输入user password）</code> </p>
</li>
</ul>

        
      </div>
      <p class="repo-list-meta">
        <span class="meta-info">
          <span class="octicon octicon-calendar"></span>
           <time datetime="2015-08-03T03:09:00.000Z" itemprop="datePublished">2015-08-03</time>
        </span>

        
          <span class="meta-info">
            <span class="octicon octicon-file-directory"></span>
            <a href='/categories/MySQL/' title=''>MySQL</a>
          </span>
        
      
        <!--
          
            <ul class="article-tag-list"><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/mysql/">mysql</a></li></ul>
          
        -->

      </p>
    </div>
  </article>
            
        </div>
        <div class="column one-third">
          <h3>Search</h3>


<div id="site_search">
	<form action="http://www.google.com/search?" data-site="http://upeng.github.io">
    	<input type="text" id="search_box" name="q" placeholder="Search" style="width: 253px;">
    	<button type="button" class="btn btn-default" id="site_search_do"><span class="octicon octicon-search"></span></button>
    </form>
</div>

<ul id="search_results"></ul>
<h3>Repositories</h3>

    
    <div class="popular-container"></div>
    
    <script type="text/template" id="popular-list-template">
        <a href="{%=clone_url%}" class="card text-center" target="_blank">
            <div class="thumbnail">
                <div class="card-image geopattern" data-pattern-id="{%=name%}">
                    <div class="card-image-cell">
                        <h3 class="card-title">
                            {%=name%}
                        </h3>
                    </div>
                </div>
                <div class="caption">
                    <div class="card-description">
                        <p class="card-text">
                            {%=description%}
                        </p>
                    </div>
                    <div class="card-text">
                        <span class="meta-info tooltipped tooltipped-n" aria-label="{%=stargazers_count%} stars">
                            <span class="octicon octicon-star"></span> {%=stargazers_count%}
                        </span>
                        <span class="meta-info tooltipped tooltipped-n" aria-label="{%=forks_count%} forks">
                            <span class="octicon octicon-git-branch"></span> {%=forks_count%}
                        </span>
                        <span class="meta-info tooltipped tooltipped-n" aria-label="最后更新时间：{%=updated_at%}">
                            <span class="octicon octicon-clock"></span>
                            <time datetime="{%=updated_at%}">{%=updated_at%}</time>
                        </span>
                    </div>
                </div>
            </div>
        </a>
    </script>

    <script src="/js/baiduTemplate.js"></script>
    <script type="text/javascript">
        var popular_repos = function(){

            var baiduTpl = new Object();

            var handleTpl = function(){
                baiduTpl.popular_list = baidu.template("popular-list-template");
            };

            var handleGithub = function(){
                var popularContainer = $(".popular-container");

                var repos = "upeng.github.io,codeIgniter-captcha,learn-vuejs".split(",");
                for(var i in repos){
                    var name = repos[i];
                    $.get("https://api.github.com/repos/upeng/"+name,handle);
                }

                function handle(result){
                    result.updated_at = result.updated_at.split("T")[0];
                    if(result){
                        var html = baiduTpl.popular_list(result);
                        popularContainer.append(html);
                        $(".geopattern").each(function(){           
                            $(this).geopattern($(this).data('pattern-id'));
                        });
                    }
                }
            };

            return {
                init:function(){
                    handleTpl();
                    handleGithub();
                }
            }
        }; 
        $(popular_repos().init);
    </script>

        </div>
    </div>

    
</section>

<footer class="container">
    <div class="site-footer" role="contentinfo">
        <div class="copyright left mobile-block">
                © 2016
                <span title="yupeng">yupeng</span>
                <a href="javascript:window.scrollTo(0,0)" class="right mobile-visible">TOP</a>
        </div>

        <ul class="site-footer-links right mobile-hidden">
            <li>
                <a href="javascript:window.scrollTo(0,0)" >TOP</a>
            </li>
        </ul>

        <a href="https://github.com/upeng" target="_blank" aria-label="view source code">
            <span class="mega-octicon octicon-mark-github" title="GitHub"></span>
        </a>

        <ul class="site-footer-links mobile-hidden">
            
                  
                  <li>
                    <a href="/"  title="Home">Home</a>
                  </li>
            
                  
                  <li>
                    <a href="/categories/"  title="Categories">Categories</a>
                  </li>
            
                  
                  <li>
                    <a href="/bookmark/"  title="Bookmark">Bookmark</a>
                  </li>
            
                  
                  <li>
                    <a href="http://shareup.sinaapp.com"  title="Share">Share</a>
                  </li>
            
                  
                  <li>
                    <a href="/about/"  title="About">About</a>
                  </li>
            
            <li>
                <a href="/atom.xml">
                    <span class="octicon octicon-rss" style="color:orange;"></span>
                </a>
            </li>
        </ul>
    </div>
</footer>


		<script src="/js/geopattern.js"></script>

		

		<script src="/js/highlight.pack.js"></script>
		<script src="/lib/fancybox/jquery.fancybox-1.3.4.pack.js"></script>

		<script src="/js/index.js"></script>

		 <script src="/js/popular_repo.js"></script> 

	</body>
</html>